package main

import "fmt"

func main() {
	// slice 切片(java中的集合), 不指定长度的数组,可以自动扩容
	//var arr1 []int
	//fmt.Println(arr1)
	//var arr2 = []int{1, 2, 3, 4, 5}
	//fmt.Println(arr2)
	//var arr3 = []int{1: 2, 3: 4, 5}
	//fmt.Println(arr3)

	//var arr1 []int
	//fmt.Println(arr1)
	//// golang中声明切片以后,切片的默认值是nil
	//fmt.Println(arr1 == nil)

	//var strSlice = []string{"java", "c++", "python"}
	//for i, s := range strSlice {
	//	fmt.Println(i, s)
	//}

	// 通过数组(切片)创建切片
	//var strArr = [4]string{"java", "c++", "python", "go"}
	//// 获取数组中的所有值
	//var strSlice = strArr[:]
	//fmt.Printf("%v-%T\n", strSlice, strSlice)
	//var strSlice2 = strArr[1:3]
	//fmt.Printf("%v-%T\n", strSlice2, strSlice2)
	//var strSlice3 = strArr[1:]
	//var strSlice4 = strArr[:3]
	//fmt.Printf("%v-%T\n", strSlice3, strSlice3)
	//fmt.Printf("%v-%T\n", strSlice4, strSlice4)

	// 关于切片的长度(个数)和容量(底层数组的长度)
	//var strArr = []string{"java", "c++", "python", "go", "javascript"}
	//fmt.Printf("%v-%v\n", len(strArr), cap(strArr))
	//a := strArr[2:]
	//fmt.Printf("%v-%v\n", len(a), cap(a))

	// make函数声明切片
	//sliceA := make([]string, 3)
	//fmt.Printf("%v-%v\n", len(sliceA), cap(sliceA))
	//sliceB := make([]string, 3, 10)
	//fmt.Println(sliceB)

	// golang中没法通过下标的方式扩容, 扩容需要使用append方法
	//var sliceC []int
	////println(sliceC)
	//sliceC = append(sliceC, 12)
	//sliceC = append(sliceC, 122)
	//fmt.Println(sliceC)

	// append方法合并切片
	//sliceA := []int{1, 2, 3}
	//sliceB := []int{4, 5, 6}
	//sliceA = append(sliceA, sliceB...)
	//fmt.Println(sliceA)

	// 切片的扩容策略, 1/2/4/8/16...
	//var slice []int
	//for i := 0; i < 10; i++ {
	//	slice = append(slice, i)
	//	fmt.Printf("%v 长度:%d, 容量:%d \n", slice, len(slice), cap(slice))
	//}

	// 使用 copy()函数复制切片
	//a := []int{1, 2, 3, 4, 5}
	//c := make([]int, 5, 5)
	//// 深拷贝
	//copy(c, a)     //使用 copy()函数将切片 a 中的元素复制到切片 c
	//fmt.Println(a) //[1 2 3 4 5]
	//fmt.Println(c) //[1 2 3 4 5]
	//c[3] = 4444
	//fmt.Println(a)
	//fmt.Println(c)

	// Go 语言中并没有删除切片元素的专用方法，我们可以使用切片本身的特性来删除元素。 代
	//码如下：
	// 从切片中删除元素
	a := []int{30, 31, 32, 33, 34, 35, 36, 37}
	// 要删除索引为 2 的元素
	a = append(a[:2], a[3:]...)
	fmt.Println(a) //[30 31 33 34 35 36 37]
}
